/**
 * @author       Richard Davey <rich@photonstorm.com>
 * @copyright    2020 Photon Storm Ltd.
 * @license      {@link https://opensource.org/licenses/MIT|MIT License}
 */

 var MergeXHRSettings = require('./MergeXHRSettings');

 /**
  * Creates a new XMLHttpRequest (xhr) object based on the given File and XHRSettings
  * and starts the download of it. It uses the Files own XHRSettings and merges them
  * with the global XHRSettings object to set the xhr values before download.
  *
  * @function Phaser.Loader.XHRLoader
  * @since 3.0.0
  *
  * @param {Phaser.Loader.File} file - The File to download.
  * @param {Phaser.Types.Loader.XHRSettingsObject} globalXHRSettings - The global XHRSettings object.
  * @param {XMLHttpRequest} [xhrLoader]
  * @return {XMLHttpRequest} The XHR object.
  */
 var XHRLoader = function (file, globalXHRSettings, xhrLoader)
 {
     var config = MergeXHRSettings(globalXHRSettings, file.xhrSettings);
 
     var xhr ;

     if(xhrLoader){
         xhr = xhrLoader;
     } else {
       xhr = new XMLHttpRequest();
     }    
 
     xhr.open('GET', file.src, config.async, config.user, config.password);
 
     xhr.responseType = file.xhrSettings.responseType;
     xhr.timeout = config.timeout || 20000;
     // xmlrequest retry limit times
     xhr.retryTimes = config.retryTimes || 1;
     if (config.headers)
     {
         for (var key in config.headers)
         {
             xhr.setRequestHeader(key, config.headers[key]);
         }
     }
 
     if (config.header && config.headerValue)
     {
         xhr.setRequestHeader(config.header, config.headerValue);
     }
 
     if (config.requestedWith)
     {
         xhr.setRequestHeader('X-Requested-With', config.requestedWith);
     }
 
     if (config.overrideMimeType)
     {
         xhr.overrideMimeType(config.overrideMimeType);
     }
 
     if (config.withCredentials)
     {
         xhr.withCredentials = true;
     }
 
     // After a successful request, the xhr.response property will contain the requested data as a DOMString, ArrayBuffer, Blob, or Document (depending on what was set for responseType.)
 
     xhr.onload = file.onLoad.bind(file, xhr);
     xhr.onerror = file.onError.bind(file, xhr);
     xhr.onprogress = file.onProgress.bind(file);
     xhr.ontimeout = file.onTimeout.bind(file, xhr);
 
     //  This is the only standard method, the ones above are browser additions (maybe not universal?)
     // xhr.onreadystatechange
 
     try {
        xhr.send();
      } catch (error) {
        console.error("xhr load error:" + error);
        xhr.onerror(xhr,error);
        throw error;
      }

     return xhr;
 };
 
 module.exports = XHRLoader;
 